FlexGrid for UWP/WinRT
データのフィルタ処理

C1CollectionView インタフェースは、Filter プロパティを使用したデータのフィルタ処理をサポートします。Filter プロパティは、コレクション内の各項目に対して呼び出されるメソッドを指定します。このメソッドが true を返す場合、その項目はビューに含まれます。このメソッドが false を返す場合、その項目はフィルタ処理されて非表示になります。この種類のメソッドは、述語メソッドです。

この Studio のサンプルに付属する FlexGridSamples ソリューションには、ユーザーが検索する値を入力する TextBox コントロールとタイマーで構成される SearchBox コントロールが含まれています。このタイマーは、検索する値をユーザーが入力する際に、1文字ごとにフィルタが適用し直されることがないように、短時間の遅延を提供します。

ユーザーが入力を停止すると、このタイマーが次のコードを使用して動作し、フィルタを適用します。

C#
コードのコピー
bool Filter(object item)
{
 // 検索テキストを取得します
 var srch = _txtSearch.Text;

 // テキストがない場合は、すべての項目を表示します
 if (string.IsNullOrEmpty(srch))
 {
 return true;
 }

 // 指定されたプロパティのいずれかにこのテキストが含まれている項目を表示します
 foreach (PropertyInfo pi in _propertyInfo)
 {
 var value = pi.GetValue(item, null) as string;
 if (value != null && value.IndexOf(srch, StringComparison.OrdinalIgnoreCase) > -1)
 {
 return true;
 }
 }

 // この項目を除外します...
 return false;
}

boolean 関数を使用して Filter プロパティの値を設定していることに注意してください。

この関数は、項目をパラメータとして受け取り、オブジェクトの指定されたプロパティの値を取得し、オブジェクトのいずれかのプロパティに検索対象の文字列が含まれる場合は true を返します。

たとえば、オブジェクトの型が "Song" であり、指定されたプロパティが "Title"、"Album"、および "Artist" である場合、この関数は、曲のタイトル、アルバム、またはアーティスト内に検索対象の文字列が見つかった場合に true を返します。これは、強力で使いやすい検索メカニズムであり、Apple の iTunes アプリケーションで使用されているメカニズムに似ています。

フィルタが適用されると、グリッド(および C1CollectionView オブジェクトに連結されているその他すべてのコントロール)にはフィルタの結果が直ちに反映されて、フィルタによって選択された項目のみが表示されます。

フィルタ処理とグループ化は、組み合わせて使用しても適切に機能することに注目してください。次の図に、非常に大きな曲のリストにフィルタが適用されている様子を示します。

この図は、フィルタが "Water" という単語に設定された際に取得したものです。フィルタは、すべてのフィールド(song、album、artist)で一致を検索します。このため、"Creedence Clearwater Revival" の曲はすべて自動的に含まれます。

グリッドの上に表示されているステータスラベルに注目してください。リストが変更されるたびに、このラベルは自動的に更新されます。したがって、フィルタが適用されると、このステータスは新しいフィルタを反映して更新されます。ステータスを更新するルーチンは、LINQ を使用して、選択されたアーティスト、アルバム、および曲の数を計算し、合計のストレージと再生時間を計算します。曲のステータス更新ルーチンは、次のように実装されます。

C#
コードのコピー
// 曲のステータスを更新します
void UpdateSongStatus()
{
 var view = _flexiTunes.ItemsSource as C1.Xaml.IC1CollectionView;
 var songs = view.OfType<Song>();
 _txtSongs.Text = string.Format("{0:n0} Artists; {1:n0} Albums; {2:n0} Songs; 
 {3:n0} MB of storage; {4:n2} days of music.",
 (from s in songs select s.Artist).Distinct().Count(),
 (from s in songs select s.Album).Distinct().Count(),
 songs.Count(),
 (double)(from s in songs select s.Size / 1024.0 / 1024.0).Sum(),
 (double)(from s in songs select s.Duration / 1000.0 / 3600.0 / 24.0).Sum());
}

このルーチンは、グリッドには直接関連しませんが、大きなデータソースに連結されたグリッドを表示する際に必要になることが多い状態情報を要約するために LINQ 機能を活用する方法を示すことができるため、ここに記載しました。

上の LINQ 文は、Distinct および Count コマンドを使用して、現在データソースで公開されているアーティスト、アルバム、および曲の数を計算します。また、Sum コマンドを使用して、現在の選択範囲の合計のストレージと再生時間を計算します。

 

 


Copyright © GrapeCity inc. All rights reserved.